package com.zwh.wx.utils;

import lombok.extern.slf4j.Slf4j;

import java.security.MessageDigest;
import java.util.Arrays;

/**
 * sha1生成签名工具类
 *
 * 提供了一个静态方法来生成SHA1签名，主要用于安全验证
 *
 * @author: zwh
 * @date: 2024/11/5
 */
@Slf4j
public class SHA1 {

    /**
     * 用SHA1算法生成安全签名
     *
     * @param token     票据，用于验证的令牌
     * @param timestamp 时间戳，用于防止重放攻击
     * @param nonce     随机字符串，确保签名的唯一性
     * @param encrypt   密文，需要生成签名的数据
     * @return 安全签名，返回生成的SHA1签名
     */
    public static String getSHA1(String token, String timestamp, String nonce, String encrypt) {
        try {
            // 将传入的参数组成数组，为后续的排序做准备
            String[] array = new String[]{token, timestamp, nonce};
            StringBuffer sb = new StringBuffer();
            // 字符串排序，确保签名的一致性
            Arrays.sort(array);
            // 将排序后的字符串拼接起来
            for (int i = 0; i < 3; i++) {
                sb.append(array[i]);
            }
            String str = sb.toString();
            // 使用SHA1进行签名生成
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(str.getBytes());
            byte[] digest = md.digest();

            StringBuffer hexStr = new StringBuffer();
            String shaHex = "";
            // 将生成的签名转换为十六进制字符串
            for (int i = 0; i < digest.length; i++) {
                shaHex = Integer.toHexString(digest[i] & 0xFF);
                // 确保每个字节转换后的长度为2，不足2位前补0
                if (shaHex.length() < 2) {
                    hexStr.append(0);
                }
                hexStr.append(shaHex);
            }
            // 返回最终的签名结果
            return hexStr.toString();
        } catch (Exception e) {
            // 记录签名生成失败的日志
            log.error("sha加密生成签名失败:", e);
            return null;
        }
    }
/*
*
*
[32mget验签请求参数：signature:，timestamp:，nonce:，echostr:7210846528145979347^[[m

* */
    /**
     * 本地测试方法
     */
    public static void main(String[] args) {
        // 这是我们配置的token
        String token = "adwidhaidwoaidh";
        // 这些参数从微信公众号配置失败时的日志中获取
        String timestamp = "1736234640"; // 把失败日志中的timestamp填在这
        String nonce = "1580208312";     // 把失败日志中的nonce填在这
        String signature = "0873574b0590ea11ed0c53c7c165ec58d9ead788"; // 把失败日志中的signature填在这

        // 计算签名
        String calculatedSignature = getSHA1(token, timestamp, nonce, "");
        
        System.out.println("Token: " + token);
        System.out.println("Timestamp: " + timestamp);
        System.out.println("Nonce: " + nonce);
        System.out.println("微信传来的签名: " + signature);
        System.out.println("我们计算的签名: " + calculatedSignature);
        System.out.println("签名是否匹配: " + signature.equals(calculatedSignature));
    }
}
